package testJdk.commonUse.number.testBigDecimal;

import org.junit.Test;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @Name : com.big_decimal.TestBigDecimal
 * @Description : 描述
 * Created by cyd on 2020-12-12 09:27:38
 */
public class TestBigDecimal {


    /**
     * BigDecimal构造的时候应该使用字符串为入参，更准确
     */
    @Test
    public void test01() {
        BigDecimal a = new BigDecimal(0.1);
        System.out.println("a values is:" + a);
        System.out.println("=====================");
        BigDecimal b = new BigDecimal("0.1");
        System.out.println("b values is:" + b);
    }

    /**
     * BigDecimal货币运算
     */
    @Test
    public void test02() {
        NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
        NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用
        percent.setMaximumFractionDigits(3); //百分比小数点最多3位

        BigDecimal loanAmount = new BigDecimal("15000.4856"); //贷款金额
        BigDecimal interestRate = new BigDecimal("0.000008"); //利率
        BigDecimal interest = loanAmount.multiply(interestRate); //相乘

        System.out.println("贷款金额:\t" + currency.format(loanAmount));
        System.out.println("利率:\t" + percent.format(interestRate));
        System.out.println("利息:\t" + currency.format(interest));
    }

    //保留两位小数第三位如果大于4会进一位（四舍五入）
    double f = 6.23556;

    /**
     * BigDecimal和Float的互转
     * 设置精度
     */
    @Test
    public void fun1() {
        BigDecimal bg = new BigDecimal(f);
        /*
         * 参数：
         * newScale - 要返回的 BigDecimal 值的标度。
         * roundingMode - 要应用的舍入模式。
         * 返回：一个 BigDecimal，其标度为指定值，其非标度值可以通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定。
         */
        double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(f1);
    }

    /**
     * DecimalFormat来简单规范
     */
    @Test
    public void fun2() {
        DecimalFormat df = new DecimalFormat("#0.00");
        String format = df.format(f);
        System.out.println(format);
    }

    /**
     * String.format打印最简便
     */
    @Test
    public void fun3() {
        System.out.println(String.format("%.2f", f));
    }

    /**
     * NumberFormat
     */
    @Test
    public void fun4() {
        NumberFormat nf = NumberFormat.getNumberInstance();
        /**
         * setMaximumFractionDigits(int newValue)
         设置数的小数部分所允许的最大位数。
         */
        nf.setMaximumFractionDigits(2);
        System.out.println(nf.format(f));
    }

}
